/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package roombaComm;

/**
 *
 * @author i8913587
 */
public class HiloSensores extends Thread{
    
    // Objeto para bloquear
    private static final Object bloqueo = new Object();
    
    private boolean estado;
    private int packet;
    private int autoUpdateTime;
    private RoombaUSAL padre;
    private byte[] enviar;
    private int tam_recibir;
    
    /**
     * Constructor para un grupo de sensores con tiempo de auto actualizacion
     * @param padre Padre que lo llama
     * @param packet Grupo de sensores
     * @param autoUpdateTime Tiempo de actualizacion automatico en milisegundos
     */
    public HiloSensores(RoombaUSAL padre, int packet, int autoUpdateTime){
        this.padre = padre;
        this.packet = packet;
        this.autoUpdateTime = autoUpdateTime;
        this.estado = true; 
        this.enviar = new byte[2];
        enviar[0] = (byte) RoombaUSAL.SEND_SENSORS;
        
        cargar();
    }
    
    /**
     * Constructor para un grupo de sensores sin auto actualizaciÃ³n
     * @param padre Padre que lo llama
     * @param packet Grupo de sensores
     */
    public HiloSensores(RoombaUSAL padre, int packet){
        this.padre = padre;
        this.packet = packet;
        this.autoUpdateTime = 0;
        this.estado = false;
        this.enviar = new byte[2];
        enviar[0] = (byte) RoombaUSAL.SEND_SENSORS;
        cargar();
    }
    
    /**
     * Constructor para el actualizador de la odometria
     * @param padre Padre que lo llama
     * @param datos Datos que se requieren
     * @param tam TamaÃ±o de la informaciÃ³n requerida
     */
    public HiloSensores(RoombaUSAL padre, byte[] datos, int tam){
        this.padre = padre;
        this.enviar = datos;
        this.autoUpdateTime = 0;
        this.estado = false;
        this.packet = RoombaUSAL.ODOMETRIA;
        this.tam_recibir = tam;
    }
    
    /**
     * Metodo que ejecuta la accion del hilo
     */
    @Override
    public void run() {
        // Datos que se reciben
        byte[] recibido = null;
        
        // Bucle que se ejecuta hasta que se mata el hilo
        do{
            // Bloqueamos y realizamos acciones pertinentes
            synchronized(bloqueo)
            {
                System.out.println("Entrada en secciÃ³n critica " + this.packet + " " + System.currentTimeMillis());
                padre.send(this.enviar);
                recibido = padre.read(this.tam_recibir);
                padre.setSensorsGroup(this.packet,recibido);
                System.out.println("Salida en secciÃ³n critica " + this.packet + " " + System.currentTimeMillis());
            }
            // Pausa
            padre.pause(autoUpdateTime);
            
        }while(this.estado);
    }
    
    /**
     * Metodo para extinguir el hilo
     */
    public void remove(){
        this.estado = false;
    }
    
    /**
     * Metodo para cambiar el tiempo de auto actualizacion
     * @param autoUpdateTime Nuevo tiempo auto actualizacion en milisegundos
     */
    public void setAutoUpdateTime(int autoUpdateTime){
        this.autoUpdateTime = autoUpdateTime;
    }
    
    /**
     * Metodo que nos determina el identificador del paquete a pedir y el 
     * tamaÃ±o de la informaciÃ³n que se devuelve.
     */
    private void cargar(){
        
        switch(this.packet){
            case RoombaUSAL.GRUPO_SENSORES_1:
                this.enviar[1] = RoombaUSAL.GRUPO_SENSORES_1_ID;
                this.tam_recibir = RoombaUSAL.GRUPO_SENSORES_1_TAM;
                break;
            case RoombaUSAL.GRUPO_SENSORES_2:
                this.enviar[1] = RoombaUSAL.GRUPO_SENSORES_2_ID;
                this.tam_recibir = RoombaUSAL.GRUPO_SENSORES_2_TAM;
                break;
            case RoombaUSAL.GRUPO_SENSORES_3:
                this.enviar[1] = RoombaUSAL.GRUPO_SENSORES_3_ID;
                this.tam_recibir = RoombaUSAL.GRUPO_SENSORES_3_TAM;
                break;
            case RoombaUSAL.GRUPO_SENSORES_4:
                this.enviar[1] = RoombaUSAL.GRUPO_SENSORES_4_ID;
                this.tam_recibir = RoombaUSAL.GRUPO_SENSORES_4_TAM;
                break;
            case RoombaUSAL.GRUPO_SENSORES_5:
                this.enviar[1] = RoombaUSAL.GRUPO_SENSORES_5_ID;
                this.tam_recibir = RoombaUSAL.GRUPO_SENSORES_5_TAM;
                break;
            case RoombaUSAL.GRUPO_SENSORES_106:
                this.enviar[1] = RoombaUSAL.GRUPO_SENSORES_106_ID;
                this.tam_recibir = RoombaUSAL.GRUPO_SENSORES_106_TAM;
                break;
        }
    }
}
